#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h> 
#include <sys/wait.h>

// 父进程只等待一个子进程(非阻塞轮询等待)
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {
        // child
        int cnt = 5;
        while(cnt)
        {
            printf("I am child, pid：%d, ppid：%d, cnt：%d\n", getpid(), getppid(), cnt--);
            sleep(1);
            //a /= 0;
        }
        exit(11);
    }
    else 
    {
        // parent 
        // 目前为止，进程等待是必须的！
        //int ret = wait(NULL);
        while(1)
        {
            int status = 0;
            int ret = waitpid(id, &status, WNOHANG);
            if(ret > 0)
            {
                // 0111 1111:0x7F,1111 1111 0000 0000:0xFF00
                //printf("wait success! exit signal：%d, exit code：%d!\n", status&0X7F, (status >> 8)&0XFF);
                if(WIFEXITED(status))
                {
                    printf("子进程正常退出，退出码是：%d\n", WEXITSTATUS(status));
                }
                else 
                {
                    printf("子进程被异常终止！\n");
                }
                break;
            }
            else if(ret == 0)
            {
            	// 父进程的任务可以写在这里
                printf("child process is running...\n");
            }
            else
            {
                printf("等待出错！\n");
            }
            sleep(1);
        }
        sleep(2);
    }

    return 0;
}

//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        perror("fork");
//        return 1;
//    }
//    else if(id == 0)
//    {
//        // child
//        int cnt = 5, a = 10;
//        while(cnt)
//        {
//            printf("I am child, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt--);
//            sleep(1);
//            a /= 0; // 故意制造一个异常
//        }
//        exit(11); // 将退出码故意设置成11
//    }
//    else 
//    {
//        // parent
//        int cnt = 10;
//        while(cnt)
//        {
//            printf("I am parent, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt--);
//            sleep(1); 
//        }
//
//        // 目前为止，进程等待是必须的！
//        //int ret = wait(NULL);
//        int status = 0;
//        int ret = waitpid(id, &status, 0);
//        if(ret == id)
//        {
//        	// 获取子进程退出状态信息的关键代码
//            // 0111 1111:0x7F,1111 1111 0000 0000:0xFF00
//            printf("wait success! exit signal:%d, exit code:%d!\n", status&0X7F, (status >> 8)&0XFF); 
//        }
//        sleep(5);
//    }
//    return 0;
//}



//#define N 5    
//// 父进程等待多个子进程    
//void RunChild()    
//{    
//    int cnt = 5;    
//    while(cnt--)    
//    {    
//        printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());    
//        sleep(1);    
//    }    
//    return;    
//}    
//int main()    
//{    
//    for(int i = 0; i < N; i++)    
//    {    
//        pid_t id = fork();// 创建一批子进程    
//        if(id == 0)    
//        {    
//            // 子进程    
//            RunChild();    
//            exit(0);    
//        }    
//        // 父进程    
//        printf("Creat process sucess:%d\n", id);    
//    }    
//    
//    sleep(10);    
//    
//    for(int i = 0; i < N; i++)    
//    {    
//        pid_t id = wait(NULL);                                                                           
//        if(id > 0)    
//        {    
//            printf("Wait process:%d, success!\n", id);    
//        }    
//    }    
//    
//    sleep(5);    
//    return 0;    
//}


//int main()
//{
//    pid_t id = fork();
//    if(id < 0)
//    {
//        perror("fork");
//        return 1;
//    }
//    else if(id == 0)
//    {
//        // child
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("I am child, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//            cnt--;
//            sleep(1);
//        }
//        exit(0);
//    }
//    else
//    {
//        // parent
//        int cnt = 10;
//        while(cnt)
//        {
//            printf("I am father, pid:%d, ppid:%d, cnt:%d\n", getpid(), getppid(), cnt);
//            cnt--;
//            sleep(1);
//        }
//        // wait是任意等待一个子进程退出
//        // pid_t ret = wait(NULL);
//        pid_t ret = waitpid(id, NULL, 0);
//        if(ret == id)
//        {
//            printf("wait success, ret:%d\n", ret);
//        }
//
//        sleep(5);
//    }
//
//    return 0;
//}
